package com.bms.service.impl;

import com.bms.common.request.BudgutReq;
import com.bms.entity.Budget;
import com.bms.entity.Category;
import com.bms.mapper.BudgetMapper;
import com.bms.service.BudgetService;
import com.bms.utils.IdWorker;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * Description:
 * Author: jingcaiqi1225@gmail.com
 * Date: 2024/10/30 10:50
 */
@Service
public class BudgetServiceImpl implements BudgetService {

    @Autowired
    private BudgetMapper budgetMapper;

    /**
     * 获取预算记录的总数
     *
     * @return 预算记录的总数
     */
    @Override
    public Integer getCount() {
        return budgetMapper.getCount();
    }

    /**
     * 添加新的预算记录
     *
     * @param budget 要添加的预算对象，包含预算的详细信息
     * @return 添加成功后的预算记录数
     */
    @Override
    public Integer addBudget(Budget budget) {
        // 为预算记录设置唯一的线路ID
        budget.setBudgetId(IdWorker.getOrderCode(1));
        // 查询该线路是否已经有预算记录
        List<Budget> list = budgetMapper.selectBudgetByLineId(budget);
        if (list == null) {
            return budgetMapper.addBudget(budget);
        }
        return 0;
    }

    /**
     * 根据搜索条件获取预算记录的总数
     *
     * @param params 搜索条件的参数集合，用于筛选预算记录
     * @return 符合搜索条件的预算记录总数
     */
    @Override
    public int getSearchCount(Map<String, Object> params) {
        return budgetMapper.getSearchCount(params);
    }

    /**
     * 根据搜索条件分页查询预算记录
     *
     * @param params 搜索条件和分页参数的集合，用于筛选和分页查询预算记录
     * @return 符合搜索条件的预算记录列表
     */
    @Override
    public List<Budget> searchBudgetsByPage(Map<String, Object> params) {
        return budgetMapper.searchBudgetsByPage(params);
    }

    /**
     * 更新预算记录
     *
     * @param budget 要更新的预算对象，包含更新后的预算信息
     * @return 更新后的预算记录数
     */
    @Override
    public Integer updateBudget(Budget budget) {
        return budgetMapper.updateBudget(budget);
    }

    @Override
    public Integer updateStatus(Budget budget) {
        return null;
    }


    /**
     * 更新预算信息，计算并设置剩余预算
     *
     * @param budget 预算对象，包含总预算和已用预算
     * @return 更新操作的影响行数
     */
    @Override
    public Integer updateQL(Budget budget) {
        // 获取总预算
        BigDecimal total = budget.getTotalBudget(); // 5000
        // 获取已用预算
        BigDecimal use = budget.getUsedBudget(); // 2000
        // 计算剩余预算
        BigDecimal clean = total.subtract(use); // 3000
        // 设置剩余预算
        budget.setCleanBudget(clean); // 3000
        // 更新已用预算为总预算
        budget.setUsedBudget(use.add(clean)); // 5000
        // 调用Mapper层更新数据库
        return budgetMapper.updateQL(budget);
    }

    /**
     * 更新预算信息，用于初始化预算状态
     *
     * @param budget 预算请求对象，包含旧的总预算和新的总预算
     * @return 更新操作的影响行数
     */
    @Override
    public Integer updateJZ(BudgutReq budget) {

        // 获取年份
        int year = budget.getYear();
        // 新一年额度获取
        BigDecimal newTotalBudget = budget.getTotalBudget();
        // 重置总预算为旧的总预算
        budget.setTotalBudget(budget.getOldTotalBudget());
        // 重置已用预算为全部
        budget.setUsedBudget(budget.getOldTotalBudget());
        // 设置结转的额度
        budget.setCleanBudget(budget.getCleanBudget());
        // 设置年份
        budget.setYear(year - 1);
        // 调用Mapper层更新数据库
        budgetMapper.updateJZ(budget);

        // 合并旧的总预算和新的总预算
        BigDecimal total = newTotalBudget.add(budget.getCleanBudget());
        // 设置新的总预算
        budget.setTotalBudget(total);
        // 重置已用预算为全部
        budget.setUsedBudget(BigDecimal.valueOf(0));
        // 设置结转的额度
        budget.setCleanBudget(null);
        budget.setYear(year);

        // 插入一条新的结转后的记录
        return this.addBudget(budget);
    }

    /**
     * 查询所有条线
     * @return 条线列表
     */
    @Override
    public List<Budget> getBudgetSelectList() {
        return budgetMapper.getBudgetSelectList();
    }
}
